#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# blipoc - Blip On Console
#
# author: Cezary Statkiewicz (cezio [at] thelirium.net)
# website: http://code.google.com/p/blipoc/
#
# version: $Id$

import ConfigParser, optparse, cPickle, os
import curses
import pblipoc.api
from pblipoc.app import CommandDispatcher, set_status, dashboard, BlipocApp

from pprint import pprint
import sys, datetime

		

if __name__ == '__main__':
	### CLI setup
	usage = """Blipoc - Blip.pl on console - version %s $Id$
	"""%pblipoc.api.API_VERSION			
	cli_parser = optparse.OptionParser( version = 'blipoc version %s $Id$'%pblipoc.api.API_VERSION)
	cli_parser.set_usage(usage)
	cli_parser.add_option( '-u', '--user', type='string', dest='username',  help=u'Nazwa użytkownika')
	cli_parser.add_option( '-U', '', type='string', dest='user', help=u'ID lub login użytkownika, o którym chcesz pobrać informacje')
	cli_parser.add_option( '-p', '--password', type='string', dest='password',  help=u'Hasło użytkownika')
	cli_parser.add_option( '-i', '--interactive', action='store_true', dest='interactive', help=u'Uruchom w trybie interaktywnym')
	cli_parser.add_option( '', '--ignore', dest='ignore', help=u'Ustaw listę ignorowanych blipowiczów')
	cli_parser.add_option( '', '--debug', action='store_true', dest='debug', help=u'Pokazuj informacje debugowe (domyślnie: tak)')
	cli_parser.add_option( '', '--no-debug', action='store_false', dest='debug', help=u'Nie pokazuj informacji debugowych')
	cli_parser.add_option( '-s', '--set', type='string', dest='set_status', help=u'Ustawia status')
	cli_parser.add_option( '-f', '--friends', action='store_true', dest='friends', help=u'Pobierz listę przyjaciół')
	cli_parser.add_option( '-d', '--dashboard', type='int', dest='dashboard', help=u'Pobierz dashboard od statusu o podanym id')
	cli_parser.add_option( '-g', '--get', type='string', dest='get_status', help=u'Pobierz dany status')
	cli_parser.add_option( '-e', '--encoding', type='string', dest='encoding', help=u'Kodowanie znaków wprowadzanych na konsoli (domyślne utf-8)')
    
	
	# mark for cli setup
	CLI_SETUP = False
	CFG_SETUP = False
	SETTINGS_FILE = '~/.blipoc/settings.cfg'
	
	if len(sys.argv)>1:
		options, args = cli_parser.parse_args()
		CLI_SETUP = True
	
	### end CLI setup
	### .ini setup
	
	if os.path.exists( os.path.expanduser(SETTINGS_FILE) ):
		config = ConfigParser.ConfigParser()
		config.read(os.path.expanduser(SETTINGS_FILE))
		CFG_SETUP = True
	else:
		try:
			os.makedirs( os.path.dirname(os.path.expanduser(SETTINGS_FILE)))
		except OSError:
			pass
		
	# .ini <-> cli options mapping dict
	# first key - section in .ini
	#   list item - cli options property
	
	_mapping = {'user': ['username', 'password']
			    ,
				'settings': ['interactive', 'encoding', 'debug']}
#				'data': []}
	if CLI_SETUP:
		if CFG_SETUP:
			for k in _mapping:
				for subk in _mapping[k]:
					if getattr(options, subk, None):
						if not config.has_section(k):
							config.add_section(k)
						config.set(k, subk, getattr(options,subk) or '')
	
		else:
			config = ConfigParser.ConfigParser()
			for k in _mapping:
				config.add_section(k)
				for subk in _mapping[k]:
					config.set(k, subk, getattr(options, subk) or '')
			CFG_SETUP = True
			
	if CFG_SETUP:
		config.write(open(  os.path.expanduser(SETTINGS_FILE), 'w' ))
		pblipoc.api.DEBUG = config.getboolean('settings', 'debug')
        
	### end .ini setup 

	### non-interactive ###
	commands = CommandDispatcher()
		
	if CLI_SETUP and not getattr(options, 'interactive', False) :
		commands.parse_commands(options, config)
		commands.run()

	elif CLI_SETUP and getattr(options, 'interactive', False):
		app = BlipocApp(commands)
		
		app.run()
		#
		
	elif CFG_SETUP:
		commands.install_command(dashboard, None, config)
		commands.run()
	else:
		sys.exit('How did you do that?')
